

/**
 * 生成心知天气API完整请求URL
 * 基于CryptoJS库实现HMAC-SHA1签名
 * @param {Object} options - 配置参数
 * @param {string} options.publicKey - 公钥(uid)
 * @param {string} options.privateKey - 私钥
 * @param {string} options.location - 城市（如：beijing、shanghai、广州）
 * @param {string} [options.apiType='now'] - API类型（now:实时天气，daily:预报）
 * @param {number} [options.ttl=1800] - 签名失效时间(秒)
 * @returns {Promise<string>} 完整请求URL
 */
async function getWeatherURL(options: {
  publicKey: string;
  privateKey: string;
  location: string;
  apiType?: 'now' | 'daily';
  ttl?: number;
}) {
  // 验证必要参数
  const { publicKey, privateKey, location } = options;
  if (!publicKey || !privateKey || !location) {
    throw new Error('公钥、私钥、城市location不能为空');
  }

  // 1. 构造基础参数
  const params = {
    ts: Math.floor(Date.now() / 1000).toString(), // 10位秒级时间戳
    ttl: options.ttl || 1800,
    uid: publicKey
  };

  // 2. 按参数名字典升序排列，生成参数字符串
  const sortedKeys = Object.keys(params).sort();
  const paramString = sortedKeys.map(key => `${key}=${params[key as keyof typeof params]}`).join('&');

  // 3. 使用CryptoJS生成HMAC-SHA1签名
  // CryptoJS已经通过@require加载
  // @ts-ignore - 忽略TypeScript对CryptoJS的类型检查
  const hmac = CryptoJS.HmacSHA1(paramString, privateKey);
  // @ts-ignore
  const base64Signature = hmac.toString(CryptoJS.enc.Base64);
  
  // 4. URL编码签名
  const sig = encodeURIComponent(base64Signature);

  // 5. 拼接完整参数（包含location和sig）
  const apiType = options.apiType === 'daily' ? 'daily.json' : 'now.json';
  const fullParams = `${paramString}&sig=${sig}&location=${encodeURIComponent(location)}`;

  // 6. 构造并返回完整URL
  return `https://api.seniverse.com/v3/weather/${apiType}?${fullParams}&language=zh-Hans&unit=c`;
}

export const city = localStorage.getItem('city') ?? '成都';

// 配置你的密钥和请求参数
const API_OPTIONS = {
  publicKey: 'Po_TCkQPEmOGYBCye', // 替换为实际公钥
  privateKey: 'SyHEWyXh1IRy-0Agl', // 替换为实际私钥
  location: city, // 城市（支持中文/拼音，如：广州、shanghai）
  apiType: 'now', // now:实时天气，daily:7天预报
  ttl: 1800
};

export const getWeather = async () => {
  try {
    const url = await getWeatherURL({
      publicKey: API_OPTIONS.publicKey,
      privateKey: API_OPTIONS.privateKey,
      location: API_OPTIONS.location,
      apiType: API_OPTIONS.apiType as 'now' | 'daily',
      ttl: API_OPTIONS.ttl
    });
    const res = await fetch(url);
    const data = await res.json();

    return data;
  } catch (err) {
    console.error('天气API错误:', err);
    return null;
  }
}
